package datautils;

//import com.romaremez.testuser.src.questionanswer.*;
import questionanswer.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.LinkedList;


public class DataFiller {

    private Question[] questions;
    private int size = 0;

    public DataFiller() {
        int defaultCapacity = 1;
        questions = new Question[defaultCapacity];
    }


    public static void main(String[] args) throws IOException {
        new DataFiller().writeQuestions();
    }



    private void addToQuestionArray(String question, String[] answers, String type, String theme) {
        addToQuestionArray(question, answers, 1, type, theme);
    }


    private void addToQuestionArray(String question, String[] answers, int correctAnswersNumber, String type, String theme) {
        int minCapacity = size + 1;
        if ((minCapacity - questions.length) > 0) {
            grow();
        }
        Answer answer = createAnswer(answers, correctAnswersNumber, type);
        questions[size++] = new Question(question, answer, theme);
    }


    private Answer createAnswer(String[] answers, int correctAnswersNumber, String type) {
        switch (type){
            case "Текстовый ответ":
                return new OneAnswer(answers[0]);
            case "Один ответ":
                return new OneAnswerFromMany(answers[0], answers);
            case "Несколько ответов":
                String[] correctAnswers = new String[correctAnswersNumber];
                System.arraycopy(answers, 0, correctAnswers, 0, correctAnswersNumber);
                return new MultipleAnswer(correctAnswers, answers);
            default:
                return null;  //TODO something here
        }
    }

    private void grow() {
        int oldCapacity = questions.length;
        int newCapacity = oldCapacity + 1;
        questions = Arrays.copyOf(questions, newCapacity);
    }

    private void writeFile() throws IOException {
        File dataHolder = new File("questions.csv");
        ObjectOutputStream writer = new ObjectOutputStream(new FileOutputStream(dataHolder));
        LinkedList<Question> qList = new LinkedList<>(Arrays.asList(questions));
        writer.writeObject(qList);

    }

    /**
     * Adds questions and answers to <code>Question[]</code> array.
     *
     */
    private void writeQuestions() throws IOException {
        String[] answers = new String[4];
        String  question = "Основные механизмы ООП";
        answers[0] = "Инкапсуляция, наследование, полиморфизм";
        answers[1] = "Инкапсуляция, абстракция, полиморфизм";
        answers[2] = "Инкапсуляция, наследование, анархизм";
        answers[3] = "Инкапсуляция, гибкость, полиморфизм";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");


        answers = new String[4];
        question = "Как зовут автора Java?";
        answers[0] = "Джеймс Гослинг";
        answers[1] = "Анджелина Джоли";
        answers[2] = "Алан Кэй";
        answers[3] = "Ким Чен Ын";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = "Как обозначается перечислимый тип?";
        answers[0] = "enum";
        answers[1] = "epam";
        answers[2] = "egum";
        answers[3] = "efun";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = "Выберите комментарий (в некотором исходном файле Java), который приведет к ошибке:";
        answers[0] = " */This is a valid comment in java. */";
        answers[1] = "/** This is a valid comment in java. */";
        answers[2] = "// This is a valid comment in java";
        answers[3] = "/** This is a valid comment in java. **/";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = String.format("В какой строке(-ах) кода содержится ошибка:%nint i = 1;//1%n" +
                "i = -+(10 + 2 + i);//2%n++i--;//3%nSystem.out.println(i);");
        answers[0] = "3";
        answers[1] = "1";
        answers[2] = "2";
        answers[3] = "2, 3";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = "Что будет, если единственный конструктор объекта объявлен как final?";
        answers[0] = "Конструктор не может быть объявлен как final";
        answers[1] = "В этом классе нельзя объявить другой конструктор";
        answers[2] = "От этого класса нельзя наследовать другой класс";
        answers[3] = "Можно создать только один экземпляр подобного класса";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = "Как изначально назывался язык Java?";
        answers[0] = "Oak";
        answers[1] = "Oak++";
        answers[2] = "Oak2.0";
        answers[3] = "Gosling";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = "В каком году появилась JAVA?";
        answers[0] = "1995";
        answers[1] = "1990";
        answers[2] = "1991";
        answers[3] = "1996";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        answers = new String[4];
        question = "В каком году началась разработка JAVA?";
        answers[0] = "1990";
        answers[1] = "1995";
        answers[2] = "1991";
        answers[3] = "1996";
        addToQuestionArray(question, answers, "Один ответ", "основы ООП");

        writeFile();
    }
}